package ASAExpression;

import application.FunctionStack;
import application.Memory;
import exceptions.ExecutionException;
import java.util.List;

/**
 * TODO: Commenter la classe ASACallFunction
 * @author O.Riad
 * @author D.Romain
 * 
 */
public class ASACallFunction extends ASAExpr{
    
    private String functionName;
    private List<String> params;
    /**
     * Constructeur pour l'appel de fonction avec ses paramètres
     * @param functionName Nom de la fonction
     * @param params Liste de paramètres à passer à la fonction
     */
    public ASACallFunction(String functionName, List<String> params){
        this.functionName = functionName; //TODO: .replace("(", "");   ???
        this.params = params;
    }

    /**
     * NON IMPLEMENTÉE
     * @return null
     */
    @Override
    public ASAExpr getExpr1() {
        return null;
    }

    
    /**
     * NON IMPLEMENTÉE
     * @return null
     */
    @Override
    public ASAExpr getExpr2() {
        return null;
    }

    
    /**
     * NON IMPLEMENTÉE
     * @return null
     */
    @Override
    public String getLabelExplorateur() {
        return null;
    }

    /**
     * Evalue l'appel de la fonction
     * @return
     * @throws ExecutionException 
     */
    @Override
    public int evalue() throws ExecutionException {
        if(this.params != null){
            List<String> cParams = FunctionStack.getFunctionParams(this.functionName);
            if(cParams.size() != this.params.size()){
                //On throw une execExecption car le nombre de paramètre n'est pas bon
                System.out.println("ERREUR PARAMETRE(S) - "+this.functionName+
                        " a besoin de "+cParams.size()+" paramètres");
            }
            for(int o=0; o<cParams.size(); o++){
                Memory.add(this.functionName, cParams.get(o), 
                        Memory.get(FunctionStack.getExecCurrentFunction(), 
                        this.params.get(o)));
            }
        }
        FunctionStack.setExecCurrentFunction(this.functionName);
        int retour =  FunctionStack.getCode(this.functionName).execute();
        FunctionStack.leaveFunction();
        return retour;
    }

}
